package com.fanchuan.uzx.rest;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.text.TextUtils;

import com.androidquery.AQuery;
import com.androidquery.callback.AjaxCallback;
import com.androidquery.callback.AjaxStatus;
import com.fanchuan.uzx.beans.NewsData;
import com.fanchuan.uzx.beans.NewsPrefs_;
import com.fanchuan.uzx.beans.NewsData.NewsEntity;
import com.fanchuan.uzx.db.NewsDB;
import com.fanchuan.uzx.db.NewsDBDao;
import com.fanchuan.uzx.rest.UZXRest.LockObject;
import com.fanchuan.uzx.ui.utils.DialogUtils;

public class NewsRest {
	private static String NEWS_URL = UZXRest.BASE_URL + "page=%d&type=1&total=%d";
	private NewsPrefs_ mPrefs;
	private NewsDBDao mNewsDBDao;
	private AQuery query;
	private Context context;
	public NewsRest(Context mContext, NewsPrefs_ prefs, NewsDBDao dao) {
		context = mContext;
		setNewsPrefs(prefs);
		this.mNewsDBDao = dao;
		query = new AQuery(mContext);
	}

	public void setNewsPrefs(NewsPrefs_ mPrefs) {
		this.mPrefs = mPrefs;
	}

	void setPrefHasNextPage(boolean hasNextPage) {
		mPrefs.edit().hasNextPage().put(hasNextPage).apply();
	}

	void setPrefNextPage(int next_page) {
		mPrefs.edit().nextPage().put(next_page).apply();
	}

	void setHasMoredata(boolean hasData) {
		mPrefs.edit().hasMoreData().put(hasData).apply();
	}

	public boolean refresh() {
		final int page = 1;
		setHasMoredata(true);
		mPrefs.edit().total().put(0).apply();
//		final LockObject lock = new LockObject();
//		AjaxCallback<String> callback = new AjaxCallback<String>() {
//			@Override
//			public void callback(String url, String object, AjaxStatus status) {
//				onResult(lock, object, page, true);
//			}
//		};
//		query.ajax(String.format(NEWS_URL, page, mPrefs.total().get()),
//				String.class, 7 * 24 * 60 * 60 * 1000, callback);
//		lock.waitForResult(30 * 1000);
//		return lock.getResult();
		
		AjaxCallback<String> callback = new AjaxCallback<String>();
		callback.url(String.format(NEWS_URL, page, mPrefs.total().get())).type(String.class);
		query.sync(callback);
		return onResult(callback.getResult(), page, true);
	}
	
	public boolean onResult(String result, int page, boolean clear_before_insert){
		if (TextUtils.isEmpty(result)) {
			// maybe network error
			return false;
		}
		
		try {
			JSONObject object = new JSONObject(result);
			String objStr = object.getString("list");
			if (objStr != null && objStr.equals("[0]")) {
				setPrefHasNextPage(false);
				setHasMoredata(false);
				return false;
			}

		} catch (JSONException e) {
			e.printStackTrace();
		}

		NewsData data = Jsoner.getInstance().fromJson(result, NewsData.class);
		NewsEntity[] newsEntities = data.list;
		if (newsEntities == null || newsEntities.length == 0) {
			setPrefHasNextPage(false);
			return false;
		}
		if (clear_before_insert) {
			mNewsDBDao.deleteAll();
		}

		for (NewsEntity f : newsEntities) {
			long count = mNewsDBDao.queryBuilder()
					.where(NewsDBDao.Properties.Id.eq(f.id)).count();
			if (count > 0) {
				continue;
			}

			NewsDB newsDB = new NewsDB(f.id, f.id, f.title, f.time, f.content,
					page);
			mNewsDBDao.insert(newsDB);
		}

		setPrefHasNextPage(true);
		setPrefNextPage(page + 1);
		return true;
	}

//	public void onResult(LockObject lock, String result, int page,
//			boolean clear_before_insert) {
//		if (TextUtils.isEmpty(result)) {
//			// maybe network error
//			lock.setResult(false);
//			lock.notifyResult();
//			return;
//		}
//		
//		try {
//			JSONObject object = new JSONObject(result);
//			String objStr = object.getString("list");
//			if (objStr != null && objStr.equals("[0]")) {
//				setPrefHasNextPage(false);
//				setHasMoredata(false);
//				lock.setResult(false);
//				lock.notifyResult();
//				return;
//			}
//
//		} catch (JSONException e) {
//			e.printStackTrace();
//		}
//
//		NewsData data = Jsoner.getInstance().fromJson(result, NewsData.class);
//		NewsEntity[] newsEntities = data.list;
//		if (newsEntities == null || newsEntities.length == 0) {
//			setPrefHasNextPage(false);
//			lock.setResult(false);
//			lock.notifyResult();
//			return;
//		}
//		if (clear_before_insert) {
//			mNewsDBDao.deleteAll();
//		}
//
//		for (NewsEntity f : newsEntities) {
//			long count = mNewsDBDao.queryBuilder()
//					.where(NewsDBDao.Properties.Id.eq(f.id)).count();
//			if (count > 0) {
//				continue;
//			}
//
//			NewsDB newsDB = new NewsDB(f.id, f.id, f.title, f.time, f.content,
//					page);
//			mNewsDBDao.insert(newsDB);
//		}
//
//		setPrefHasNextPage(true);
//		setPrefNextPage(page + 1);
//		lock.setResult(true);
//		lock.notifyResult();
//	}

	public boolean getNextPage() {
		if(!DialogUtils.checkNetWork(context)){
			return false;
		}
//		final LockObject lock = new LockObject();
//		final int page = mPrefs.nextPage().get();
//		AjaxCallback<String> callback = new AjaxCallback<String>() {
//			@Override
//			public void callback(String url, String object, AjaxStatus status) {
//				onResult(lock, object, page, false);
//			}
//		};
//		query.ajax(String.format(NEWS_URL, page, mPrefs.total().get()),
//				String.class, 7 * 24 * 40 * 60 * 1000, callback);
//
//		lock.waitForResult(30 * 1000);
//		return lock.getResult();
		
		final int page = mPrefs.nextPage().get();
		AjaxCallback<String> callback = new AjaxCallback<String>();
		callback.url(String.format(NEWS_URL, page, mPrefs.total().get())).type(String.class);
		query.sync(callback);
		return onResult(callback.getResult(), page, false);
	}
}
